package com.lsa.letcode.the13.romanToInt;

public class Solution {
	private static int[] decode = new int[26];
	private static int[][] decodeSubstract = new int[26][26];
	
	static{
		initDecode('I', 1);
		initDecode('V', 5);
		initDecode('X', 10);
		initDecode('L', 50);
		initDecode('C', 100);
		initDecode('D', 500);
		initDecode('M', 1000);
		
		initDecodeSubstr('I', 'V', 4);
		initDecodeSubstr('I', 'X', 9);
		
		initDecodeSubstr('X', 'L', 40);
		initDecodeSubstr('X', 'C', 90);
		
		initDecodeSubstr('C', 'D', 400);
		initDecodeSubstr('C', 'M', 900);
	}
	
	private static void initDecode(char c, int v) {
		decode[c - 'A'] = v;
	}
	
	private static void initDecodeSubstr(char c1, char c2, int v) {
		decodeSubstract[c1 - 'A'][c2 - 'A'] = v;
	}
	
    public int romanToInt(String s) {
    	int res = 0;
    	for (int i = 0; i < s.length(); ) {
    		int C = s.charAt(i) - 'A';
    		if (i != s.length() - 1) {
    			int nextC = s.charAt(i + 1) - 'A';
    			int val = decodeSubstract[C][nextC];
    			if (val != 0 ) {
    				res += val;
    				i += 2;
    				continue;
    			}
    		}
    		res += decode[C];
    		i++;
		}
    	return res;
    }
}